//serve文件夹是服务器
const bodyParser = require('body-parser');
const express = require('express');
const app = express();
const mysql = require('mysql');
const models = require('./db');
const $sql = require('./sqlMap');
//const cors = require('cors');    //消除浏览器同源策略（CORS）限制
const jwt = require('jsonwebtoken'); // 引入JWT包
const SECRET_KEY = 'your_secret_key'; // 定义一个密钥，用于签发和验证JWT

// 创建连接
var conn = mysql.createConnection(models.mysql);
conn.connect();

// 添加 body-parser 中间件
app.use(bodyParser.json());

// 引入 API 路由,路由文件中到处的路由对象
const login = require('./api/login'); // 新增这行，导入 login.js
//------------系统管理部分-------------------
const userApi = require('./api/user');
const log = require('./api/log');

//-------------排产输入信息管理--------------
const input_user = require('./api/input_user');
const craft = require('./api/craft');
const equip = require('./api/equipment');
const instrument = require('./api/instrument');
const quality = require('./api/quality');
const plan = require('./api/plan');
const exception = require('./api/exception');//新增
//--------------前摄性评估模块-------------------

//--------------生产计划管理模块-------------------
const dispatch_period = require('./api/dispatch_period');//新增
const dispatch_risk = require('./api/dispatch_risk');//新增

//--------------算法部分-------------------
const plant_in = require('./api/plant_in');  //新增
const pre_assess = require('./api/pre_assess');  //新增
const qitao = require('./api/zhilingqitao');

//----cors----------
const cors = require('cors'); // 引入 cors 中间件

// 设置 CORS 配置
const corsOptions = {
  origin: 'http://localhost:8080', // 允许的前端域名
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], // 允许的 HTTP 方法
  allowedHeaders: ['Authorization', 'Content-Type'], // 允许的请求头
  credentials: true // 允许携带认证信息 (如Cookies)
};

// 启用 CORS 中间件
app.use(cors(corsOptions));
//------------------------

// 将 logIP 函数作为中间件添加到 Express 应用程序中
app.use(function(req, res, next) {
    // 只在处理 POST 请求时执行 logIP 函数，记录信息
    if (req.method === 'POST' || req.originalUrl === '/api/log/refresh') {
        logIP(req, res, next);
    } else {
        next();
    }
});

// 其他路由和中间件设置
// ...

// logIP 函数，用于记录请求信息到数据库
function logIP(req,res,next) {
    console.log("main_exe")
    const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
    const url = req.originalUrl;
    let operation_tag = false;
    let name = '';
    let operation_content = '';
    if (url === '/api/user/addUser') {
        operation_tag = true;
        name = 'userdata';
        operation_content = '修改用户数据';
    } else if (url === '/api/log/refresh') {
        operation_tag = true;
        name = 'log_data';
        operation_content = '修改日志数据';
    }
    //添加新的url


    const logData = [
        '张三',//默认的操作用户
        '123456', // 默认的用户工号
        ip,
        new Date(),
         name,
         operation_content
];
    var add_log = $sql.logdata.log;
    // 在连接成功的回调函数中执行查询
    
    if (operation_tag === true){conn.query(add_log, logData, function(err, result) {
        operation_tag === false
        if (err) {
            console.log(err);
        }
        if (result) {
            // 如果需要返回响应，可以在这里添加逻辑
        }}
    )}
next();

}

// JWT 验证中间件
function authenticateToken(req, res, next) {
    const authHeader = req.headers['authorization'];
    console.log('Authorization Header:', authHeader); // 调试用

    const token = req.headers['authorization'] && req.headers['authorization'].split(' ')[1];
    console.log('token is', token)

    if (token == null) return res.sendStatus(401); // 如果没有token，返回未授权状态

    jwt.verify(token, SECRET_KEY, (err, user) => {
        if (err) {
            console.log('JWT verification failed:', err); // 打印错误原因
            return res.sendStatus(403);
        }
        req.user = user;
        next();
    });
    
}
function authorizeRoles(allowedRoles) {
    return (req, res, next) => {
        const { role } = req.user;
        if (allowedRoles.includes(role)) {
            next(); // 如果用户角色在允许访问的角色列表中，继续执行
        } else {
            return res.status(403).json({ message: '没有权限访问该资源' });
        }
    };
}

app.options('*', cors(corsOptions)); // 处理所有 OPTIONS 预检请求

//采用设置所有均可访问的方法解决跨域问题
app.all("*", function (req, res, next) {
    //设置允许跨域的域名，*代表允许任意域名跨域
    res.header("Access-Control-Allow-Origin", "*");
    //允许的header类型
    res.header('Access-Control-Allow-Headers', 'Authorization, Content-Type'); // 允许 Authorization 头
    //跨域允许的请求方式 
    res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
    if (req.method.toLowerCase() == 'options')
        res.send(200); //让options尝试请求快速结束
    else
        next();
})

//app.use(cors());
app.use(bodyParser.json())                                   //使用body-parser中间件来解析JSON格式的请求体
app.use(bodyParser.urlencoded({ extended: false }))          //解析URL编码的请求体
// 后端api路由
app.use('/api/login', login); // 新增这一行，注册 login.js 路由
//-------------系统管理部分----------------
app.use('/api/user', authenticateToken,authorizeRoles(['admin']), userApi); // 用户与权限管理
app.use('/api/craft', authenticateToken,authorizeRoles(['admin']), craft);
//-------------排产输入信息管理部分------------
app.use('/api/equipment', authenticateToken,authorizeRoles(['admin']), equip);
app.use('/api/log', authenticateToken, log);
app.use('/api/input_user', authenticateToken, input_user);
app.use('/api/instrument', authenticateToken, instrument);
app.use('./api/exception', authenticateToken, exception);
app.use('/api/quality', authenticateToken, quality);
app.use('/api/plan', authenticateToken, plan);
//------------前摄性评估部分-----------------
//------------生产计划管理部分-----------------

app.use('/api/dispatch_period',authenticateToken, dispatch_period)//新增，周期性调度
app.use('/api/dispatch_risk',authenticateToken, dispatch_risk)//新增，风险调度
//---------------算法---------------------------
app.use('/api/plant_in',authenticateToken, plant_in)
app.use('/api/pre_assess',authenticateToken, pre_assess)
app.use('/api/zhilingqitao',authenticateToken, qitao)

// 监听端口
app.listen(8000)
console.log('success listen at port:8000......')

